#ifndef CAMERA_H
#define CAMERA_H

#include "Transform.h"

class Ray;


class Camera
{

private:
    int        wid;
    int        hei;
    Matrix4f m_matrix;
    Matrix4f m_invMatrix;
    float m_phi;

    void translate(const Vector3f& vec);
    void rotateX(float ang);
    void rotateY(float ang);

public:
    Camera();

    // Retornam as resoluções horizontal e vertical, respectivamente
    // São os mesmos valores passados para applyProjection
    int width();
    int height();

    // Aplica a transformação de posicionamento de câmera
    // Supõe que a matrix corrente é a GL_MODELVIEW
    void applyModelView();

    // Aplica a transformação de projeção
    // Supõe que a matrix corrente é a GL_PROJECTION
    void applyProjection(int w, int h);

    // Move a câmera para fente
    void goAhead(float d);

    // Move a câmera para traz
    void goBack(float d);

    // Move a câmera para cima
    void goUp(float d);

    // Move a câmera para baixo
    void goDown(float d);

    // Move a câmera para a esquesda
    void goLeft(float d);

    // Move a câmera para a direita
    void goRight(float d);

    // Gira a câmera para a direita
    void turnRight(float d);

    // Gira a câmera para a esquesda
    void turnLeft(float d);

    // Gira a câmera para cima
    void turnUp(float d);

    // Gira a câmera para baixo
    void turnDown(float d);

    // Retorna um raio que parte do centro de projeção e passa pelo pixel de coordenadas (i, j),
    // onde i é a linha e j é a coluna
    Ray traceRay(int i, int j);
};

#endif // CAMERA_H
